AnsibleでCiscoルータのIOSバージョン情報を一括取得してみた
こんにちは、梶です。 今日は覚えておくと便利なバージョン情報の一括取得です。 「Ansibleを使ってネットワーク機器の情報を取得できないか?」と思い、誰もネットワーク機器に対してAnsibleを使ってなさそうなのでやってみました。 サーバでも使えると思います。
TeraTermマクロなどで行うケースが多いと思われますが、Ansible環境からルータにsshログイン可能なら、できるのではないかと思い試してみました。
お試し環境について
最後にAWS VPCに構築したCSR1000VのIOSバージョン情報の取得も実施していますが、 今回Ciscoルータがなくても試すことができるよう、Cisco DevNetからonePKの「All-in-One-VM」をダウンロードして一撃構築して試します。 *Ciscoへのユーザ登録が必要です。
「All-in-one VM」とは、Cicso製品向けアプリケーションを開発するための仮想環境です。 ダウンロードするOVF(Open Virtualization Format)のファイルを仮想環境に VM 展開すると、SDK入りのUbuntuと仮想 IOSルータを含む環境がすぐに利用できます。 なお、サポートしている仮想環境は次のとおりです。
- VMWare ESXi 5 or later
- VMWare Workstation 9 or later
- VMWare Fusion 5 or later
- Oracle VirtualBox 4.2 or later
弊社ではVMware Fusionを標準インストールしてるため利用しましたが、Virtual Boxでもできるのでお手軽です。
<参考情報> Ciscoのブログページ http://gblogs.cisco.com/jp/2014/04/developing-applications-with-onepk-all-in-one-vm/
Ciscoページから、ovfファイルをダウンロードして、VMware FusionやVirtualBoxへ展開するのみです。
仮想ルータの起動
default passwordはcisco123でVMにログイン
Start 3nodeのアイコンをクリックし、ルータ3台起動
前提条件
上記、「onePK All-in-one VM」でルータ3台が起動している状態とします。 「onePK All-in-one VM」のルータ3台のバージョンを取得します。 のちほど、VPCに構築したCSR1000Vのバージョンを別途取得します。
All-in-one VMのUbuntuへAnsibleのインストール
cisco@onepk:~$ sudo apt-get install python-pip cisco@onepk:~$ sudo apt-get install sshpass cisco@onepk:~$ sudo pip install ansible cisco@onepk:~$ ansible --version ansible 1.7.2
All-in-one VMへホストPCからsshログイン可能なように、Ubuntuへsshのインストール
cisco@onepk:~$ sudo apt-get install ssh
VM(Ubuntu)とホストPCのそれぞれで、ifconfigで確認し、接続可能なIPアドレスを確認しssh接続します。 構成によるかもしれませんが、私の環境では最初から上記のルータネットワーク用とは別にssh接続用のインターフェイスがあり、sshのインストールのみでログインできました。
sshログイン用に各ルータのconfig 設定
SSH接続でVTYポートにログインする際に、line vtyに設定されたパスワードではなく、 設定されているユーザ名とパスワードを認証を使用するようにするため、line vtyにローカル認証を設定し、保存
> enable # conf t (config)#line vty 0 4 (config-line)#login local (config-line)#exit 設定保存 # wr mem
AnsibleのPlaybook作成
各コマンド結果をファイル出力するようにしています。出力部分の記述方法が不明でかなり苦労しました。 調べても私個人では解決できなかったので、望月さんにご支援頂きました。この場を借りてお礼したく、ありがとうございました。
cisco@onepk:~$ mkdir ansible cisco@onepk:~$ cd ansible cisco@onepk:~/ansible$ vi get-version.yml --- - hosts: router gather_facts: no tasks: - name: sh clock raw : "show clock" register: show_clock - name: sh clock output local_action: shell /bin/echo "{{ show_clock.stdout }}" > /home/cisco/ansible/shclock_{{ inventory_hostname }}.txt - name: sh ver raw : "show ver" register: show_ver - name: sh ver output local_action: shell /bin/echo "{{ show_ver.stdout }}" > /home/cisco/ansible/shver_{{ inventory_hostname }}.txt
Ansible用のhostsファイル作成
cisco@onepk:~/ansible$ vi hosts [router] 10.10.10.110 10.10.10.120 10.10.10.130
エラー対応
各ルータにsshでの初回ログイン時のため、以下のエラーが発生します。
fatal: [10.10.10.xxx] => Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host.
手動でsshで一度ログインし、known_hostに登録された状態で、行います。
cisco@onepk:~/ansible$ ssh cisco@10.10.10.1xx <省略> password:cisco router > exit
ansibleの実行結果
$ ansible-playbook -i hosts get-version.yml --ask-pass cisco@onepk:~/ansible$ SSH password:cisco PLAY [router] ***************************************************************** TASK: [sh clock] ************************************************************** ok: [10.10.10.110] ok: [10.10.10.120] ok: [10.10.10.130] TASK: [sh clock output] ******************************************************* changed: [10.10.10.130 -> 127.0.0.1] changed: [10.10.10.120 -> 127.0.0.1] changed: [10.10.10.110 -> 127.0.0.1] TASK: [sh ver] **************************************************************** ok: [10.10.10.130] ok: [10.10.10.110] ok: [10.10.10.120] TASK: [sh ver output] ********************************************************* changed: [10.10.10.110 -> 127.0.0.1] changed: [10.10.10.120 -> 127.0.0.1] changed: [10.10.10.130 -> 127.0.0.1] PLAY RECAP ******************************************************************** 10.10.10.110 : ok=4 changed=2 unreachable=0 failed=0 10.10.10.120 : ok=4 changed=2 unreachable=0 failed=0 10.10.10.130 : ok=4 changed=2 unreachable=0 failed=0 cisco@onepk:~/ansible$
ansibleのバージョン確認
実行結果ファイルが作成されるため、結果を確認
cisco@onepk:~/ansible$ ls -ltr total 32 -rw-rw-r-- 1 cisco cisco 48 Nov 5 04:16 hosts -rw-rw-r-- 1 cisco cisco 461 Nov 5 17:19 get-version.yml -rw-rw-r-- 1 cisco cisco 33 Nov 5 17:55 shclock_10.10.10.130.txt -rw-rw-r-- 1 cisco cisco 35 Nov 5 17:55 shclock_10.10.10.120.txt -rw-rw-r-- 1 cisco cisco 35 Nov 5 17:55 shclock_10.10.10.110.txt -rw-rw-r-- 1 cisco cisco 1688 Nov 5 17:55 shver_10.10.10.110.txt -rw-rw-r-- 1 cisco cisco 1688 Nov 5 17:55 shver_10.10.10.120.txt -rw-rw-r-- 1 cisco cisco 1688 Nov 5 17:55 shver_10.10.10.130.txt cisco@onepk:~/ansible$ grep Version shver_*.txt shver_10.10.10.110.txt:Cisco IOS Software, IOSv Software (VIOS-ADVENTERPRISEK9-M), Experimental Version 15.4(20140730:011659) [lucylee-pi25-2 107] shver_10.10.10.120.txt:Cisco IOS Software, IOSv Software (VIOS-ADVENTERPRISEK9-M), Experimental Version 15.4(20140730:011659) [lucylee-pi25-2 107] shver_10.10.10.130.txt:Cisco IOS Software, IOSv Software (VIOS-ADVENTERPRISEK9-M), Experimental Version 15.4(20140730:011659) [lucylee-pi25-2 107] cisco@onepk:~/ansible$ grep ID shver_*.txt shver_10.10.10.110.txt:Processor board ID 9ZK2Y0HYELSW5SK8EXDXU shver_10.10.10.120.txt:Processor board ID 9WAAWI2EICLM8D4K798KJ shver_10.10.10.130.txt:Processor board ID 9FCORJDHCTTC1A74Y7TIK cisco@onepk:~/ansible$
VPCに構築したCisco CSR1000Vのバージョン調査用の追加設定
実機でも確認してみました。 VPCにCSR1000Vを構築する方法はここを参照 ホスト名でログインできるようにsshのconfig設定しました。 VPCへCSR1000V構築時の鍵の保存場所などを追記します。
$ cat ~/.ssh/config Host csr1000v HostName xxx.xxx.xxx.xxx Port 22 User ec2-user IdentityFile /home/cisco/<VPC CSR1000V用の鍵ファイル>
ssh csr1000vでログインできることを確認。
ansible用のhostsファイルにcsr1000vを追記
cisco@onepk:~/ansible$ cat hosts [router] 10.10.10.110 10.10.10.120 10.10.10.130 [csr1000v] csr1000v
ansible-playbookも以下の差分を修正
cisco@onepk:~/ansible$ cp -ip get-version.yml get-version-csr1000v.yml cisco@onepk:~/ansible$ diff get-version-csr1000v.yml get-version.yml 2c2 < - hosts: csr1000v --- > - hosts: router
AnsibleでVPCに構築したCisco CSR1000Vのバージョン確認
cisco@onepk:~/ansible$ ansible-playbook -i hosts get-version-csr1000v.yml PLAY [csr1000v] *************************************************************** TASK: [sh clock] ************************************************************** ok: [csr1000v] TASK: [sh clock output] ******************************************************* changed: [csr1000v] TASK: [sh ver] **************************************************************** ok: [csr1000v] TASK: [sh ver output] ********************************************************* changed: [csr1000v] PLAY RECAP ******************************************************************** csr1000v : ok=4 changed=2 unreachable=0 failed=0 cisco@onepk:~/ansible$ ls -ltr *csr1000v* -rw-rw-r-- 1 cisco cisco 464 Nov 5 18:34 get-version-csr1000v.yml -rw-rw-r-- 1 cisco cisco 258 Nov 5 18:41 shclock_csr1000v.txt -rw-rw-r-- 1 cisco cisco 2597 Nov 5 18:41 shver_csr1000v.txt cisco@onepk:~/ansible$ cisco@onepk:~/ansible$ grep Version shver_csr1000v.txt Cisco IOS XE Software, Version 03.13.00a.S - Extended Support Release Cisco IOS Software, CSR1000V Software (X86_64_LINUX_IOSD-UNIVERSALK9-M), Version 15.4(3)S0a, RELEASE SOFTWARE (fc2) licensed under the GNU General Public License (GPL) Version 2.0. The software code licensed under GPL Version 2.0 is free software that comes GPL code under the terms of GPL Version 2.0. For more details, see the cisco@onepk:~/ansible$
感想
sshログイン可能な機器の構成情報の収集に使えました。 Ansibleはネットワーク機器の構成確認でもつかえると思います。 All-in-One-VMの中にある、SDK用サンプルプログラム(NetworkElementTutorial.py等)でも情報取得できます。 しかし、実機で行う場合はIOSバージョンの制限やonePK接続用の証明書を設定する必要があるため、Ansibleの方が楽です。 また、別ベンダーでもできそうなので今度、試してみたいと思います。手持ちの実機が古い機器しか無い・・・汗